package com.wjm.dynamicskin.ac;

import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

import com.wjm.dynamicskin.R;
import com.wjm.dynamicskin.adapter.MyFragmentPagerAdapter;
import com.wjm.dynamicskin.fragment.MusicFragment;
import com.wjm.dynamicskin.fragment.RadioFragment;
import com.wjm.dynamicskin.fragment.VideoFragment;
import com.wjm.dynamicskin.skin.SkinManager;
import com.wjm.dynamicskin.widget.MyTabLayout;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**

 换肤
 1.内置换肤也叫静态换肤
 在Apk包中存在多种资源（图片、颜色值）用于换肤时候切换
 自由度低，apk文件大
 一般用于没有其他需求的日间/夜间模式app
 2.动态换肤
 通过运行动态加载皮肤包

 换肤流程
 1采集需要换肤的控件
 2加载皮肤包

 如何采集
 拿到界面中所有的view,从布局加载器入手
 //SkinManager构造器中注册Activity生命周期回调111111111111111111111111111111111111111
 application.registerActivityLifecycleCallbacks(new SkinActivityLifecycle());
 SkinActivityLifecycle的在activity创建时onActivityCreated回调方法中获得布局加载器LayoutInflater222222222222222222222222222222222222
 获得界面所有控件的工厂SkinLayoutFactory继承自LayoutInflater.Factory并在回调方法中得到个界面中所有的view对象23333333333333333333333333
 以上是创建出了界面中所有的view，但不是所有view都是要换肤的，所以要筛选符合属性的View4444444444444444444444444444444444444444444444
 我们把皮肤包做成一个apk，那么怎么从一个外部的apk中去加载资源呢？
 //以上筛选符合属性的View后再将View与之对应的可以动态替换的属性集合 放入 集合中，再调用applySkin进行换肤55555555555555555555555555555555555555555
 //mSkinView.applySkin();换肤的原理是集合中都保存好一一对应的要换肤的控件与相应的资源ID，关键是要去通过SkinManager.loadSkin拿到皮肤包的资源skinResource，再通过对应皮肤包的SkinResources.getInstance().xxx加载对应换肤资源
 SkinResources工具类，找到在皮肤包中的资源的ID，为0表示皮肤包中没有这个资源ID就去自已应用中去找了，有就加载皮肤中的资源达到换肤效果
 加载完皮肤包，还要应用皮肤包，那么怎么应用呢？意思就是资源虽然是加载了新的资源但没有通知控件去更新UI上是不会变的，所以才要最后在控件上应用一下
 用观察者模式
 SkinManager是被观察者，SkinAttribute是观察者,但SkinAttribute不太好注册，SkinLayoutFactory与SkinAttribute是一一对应的，那么我们可以把SkinLayoutFactory注册为观察者
 当SkinManager发生改变调用      notifyObservers通知观察者  SkinLayoutFactory时update方法被回调
 在SkinActivityLifecycle中界面创建时调用SkinManager对象来//注册观察者
 SkinManager.getInstance().addObserver(skinLayoutFactory);
在SkinManager的loadSkin方法加载皮肤包资源对象时去通知控件更新
 //应用皮肤包
 setChanged();
 //通知观察者
 notifyObservers();
 此时SkinLayoutFactory的update方法会回调,再调用真正换肤方法SkinAttribute中的applySkin

 */

/**
 * 问题?如何查看sdkLayoutInflater的源码
 */
public class MainActivity extends AppCompatActivity {

    private Button btn_skin;
    private Button btn_reset;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById();

    }

    private void findViewById() {
        btn_skin = findViewById(R.id.btn_skin);
        btn_skin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //换肤
                File externalStorageDirectory = Environment.getExternalStorageDirectory();
                SkinManager.getInstance().loadSkin(externalStorageDirectory + File.separator + "skin_0-debug.apk");
//                SkinManager.getInstance().loadSkin(externalStorageDirectory + File.separator + "app-skin-debug.skin");
            }
        });
        btn_reset = findViewById(R.id.btn_reset);
        btn_reset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SkinManager.getInstance().loadSkin(null);
            }
        });

        findViewById_MyTabLayout();

    }

    private void findViewById_MyTabLayout() {
        MyTabLayout tabLayout = findViewById(R.id.tabLayout);
        ViewPager viewPager = findViewById(R.id.viewPager);
        List<Fragment> list = new ArrayList<>();
        list.add(new MusicFragment());
        list.add(new VideoFragment());
        list.add(new RadioFragment());
        List<String> listTitle = new ArrayList<>();
        listTitle.add("音乐");
        listTitle.add("视频");
        listTitle.add("电台");
        MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter
                (getSupportFragmentManager(), list, listTitle);
        viewPager.setAdapter(myFragmentPagerAdapter);
        tabLayout.setupWithViewPager(viewPager);


        /**
         * 问题：自定义的MyTabLayout的标签上的文字换肤后变了但字体未改变？
         因为这个MyTabLayout比较特殊,它与viewpager是绑定的每个tab上的view
         是一个TabView成员属性，意思就是实际是要改变TabView中的textview的
         字体，但是没有方法可以单独去设置这里面的textview的字体，最终我们
         可以在MyTabLayout的视图初始完成后加一个更新的方法，就是再刷一遍视
         图
         */
        SkinManager.getInstance().updateSkin(this);
    }
}
